package uniandes.cupi2.joy_graph.mundo;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.xml.sax.SAXException;

import uniandes.cupi2.collections.arbolNArio.ArbolNArio;
import uniandes.cupi2.collections.grafo.Vertice;
import uniandes.cupi2.collections.grafo.VerticeNoExisteException;
import uniandes.cupi2.collections.iterador.Iterador;
import uniandes.cupi2.collections.lista.Lista;

/**
 * Interfaz del IJoyGraph
 *
 */
public interface IJoyGraph 
{
	/**
	 * Mtodo que carga la informacin de JoyP2P de una archivoXML
	 * @param archivoXML de donde se carga la informacin
	 */
	public void cargarXML( File archivoXML ) throws IOException, SAXException;
	
	/**
	 * Mtodo que busca un Cliente en la red del JoyGraph
	 * @return ICliente, cliente buscado
	 */
	public ICliente buscarCliente( String id );
	
	/**
	 * Mtodo que retorna la lista de Clientes con el archivo dado por parmetro
	 * @param archivo, nombre del archivo
	 * @return el archivo buscado
	 */
	public Lista<ICliente> buscarArchivo( String archivo );

	/**
	 * Mtodo que busca el nmero de replicas de un archivo en la red.
	 * @param archivo, nombre del archivo en la red.
	 * @return numero de replicas.
	 * @throws Exception 
	 */
	public int darReplicasArchivo( String archivo ) throws Exception;
	
	/**
	 * Mtodo que retorna el camino ms corto para transferir un archivo entre dos clientes
	 * @param inicio, ICliente inicial 
	 * @param destino, ICliente final
	 * @return ICamino mas corto entre los clientes
	 * @throws VerticeNoExisteException 
	 * @throws Exception 
	 */
	public Iterador<Vertice<String, ICliente, ICaminoJoy>> darCaminoMasCorto( String ipClienteOrigen, String ipClienteDestino) throws Exception;
	
	/**
	 * Mtodo que retorna el tiempo mnimo de propagacin de un archivo por la red Joy
	 * @return tiempo mnimo de propagacin de un archivo 
	 * @throws VerticeNoExisteException 
	 * @throws Exception 
	 */
	public long darTiempoPropagacion( String idCliente, long tamanio ) throws VerticeNoExisteException, JoyGraphException;
	
	/**
	 * Mtodo que retorna el archivo de ms replicas en la Red
	 * @return String quie representa el archivo con ms rplicas en la red
	 */
	public String darArchivoMasReplicas( );
	
	/**
	 * Mtodo que retorna el numero de vrtices del Grafo
	 * @return numero de vrtices del Joy
	 */
	public int darNumVertices( );
	
	/**
	 * Mtodo que retorna el nmeto de Arcos del Grafo
	 * @return nmero de arcos del grafo
	 */
	public int darNumArcos( );
	
	/**
	 * Mtodo que retorna un arreglo con las IPs de los vrtices
	 * @return Arreglo que contiene las IPs de todos los vrtices
	 */
	public ArrayList<String> darIpsVertices( );
	
	/**
	 * Mtodo que retorna un rbol N-ario organizado de acuerdo a la propagacin de un archivo por la redJoy
	 * @return ArbolNArio jerarquizado de acuerdo a la propagacin de los archivos
	 * @throws VerticeNoExisteException 
	 */
	public ArbolNArio<Vertice<String, ICliente, ICaminoJoy>> darArbolRecorridoPropagacion(String idCliente ) throws VerticeNoExisteException;
	
	/**
	 * Dadas dos arraylists de strings, la primera representa el vértice y la segunda el vértice destino, en la misma posición
	 */
	public void darArcos( ArrayList<String> a1, ArrayList<String> a2 );
	
}
